// 事件发布器单例类，封装事件的分发与监听，便于全局事件通信
class EventPublisher {
  /** 单例实例，确保全局唯一 */
  private static instance: EventPublisher;

  /** 内部事件目标对象，用于事件的实际分发和监听 */
  private readonly eventTarget: EventTarget;

  /** 私有构造函数，禁止外部实例化，初始化事件目标对象 */
  private constructor() {
    this.eventTarget = new EventTarget();
  }

  /**
   * 获取事件发布器的单例实例
   *
   * @returns {EventPublisher} 全局唯一的事件发布器实例
   */
  public static getInstance(): EventPublisher {
    if (!EventPublisher.instance) {
      EventPublisher.instance = new EventPublisher();
    }
    return EventPublisher.instance;
  }

  /**
   * 分发事件（支持所有 Event 类型）
   *
   * @param {E} event - 需要分发的事件对象
   * @returns {void}
   */
  public dispatchEvent<E extends Event = Event>(event: E): void {
    try {
      this.eventTarget.dispatchEvent(event);
    } catch (error) {
      // 捕获并输出分发事件时的异常，避免全局崩溃
      console.error('[EventPublisher] dispatchEvent error:', error);
    }
  }

  /**
   * 添加事件监听器（类型安全，监听器不可为 null）
   *
   * @param {K} type - 事件类型
   * @param {L} listener - 事件监听器
   * @returns {void}
   */
  public addEventListener<K extends string, L extends EventListenerOrEventListenerObject>(
    type: K,
    listener: L
  ): void {
    try {
      this.eventTarget.addEventListener(type, listener);
    } catch (error) {
      // 捕获并输出添加监听器时的异常
      console.error('[EventPublisher] addEventListener error:', error);
    }
  }

  /**
   * 移除事件监听器（类型安全，监听器不可为 null）
   *
   * @param {K} type - 事件类型
   * @param {L} listener - 事件监听器
   * @returns {void}
   */
  public removeEventListener<K extends string, L extends EventListenerOrEventListenerObject>(
    type: K,
    listener: L
  ): void {
    try {
      this.eventTarget.removeEventListener(type, listener);
    } catch (error) {
      // 捕获并输出移除监听器时的异常
      console.error('[EventPublisher] removeEventListener error:', error);
    }
  }
}

// 默认导出单例实例，方便直接使用
export default EventPublisher.getInstance();
